package com.xc.round2Assessment.petStore.pet.factory;

import com.xc.round2Assessment.petStore.exception.AnimalNotFoundException;
import com.xc.round2Assessment.petStore.pet.strategy.AnimalStrategy;
import com.xc.round2Assessment.petStore.pet.strategyEnum.StrategyEnum;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author Xc
 * @version 1.0
 * 我们的工厂类依靠我们的策略枚举返回策略类 (所以构造器的方法签名须得是策略枚举)
 */
public class StrategyFactory {
    // 使用单例模式 (饿汉式)
    // 作为 key 的 String 是全类名， value 是策略对象(的接口)
    private static final Map<String, AnimalStrategy> strategyMaps = new ConcurrentHashMap();

    public static AnimalStrategy getAnimalStrategy(StrategyEnum strategyEnum) {
        // 先定义一个抽象策略的接口对象 (从 map 中获取, 保证单例)
        AnimalStrategy animalStrategy = strategyMaps.get(strategyEnum.getValue());

        // 如果是空, 代表相应的具体策略在 strategyMaps 中还没有进行初始化。 那么用反射进行初始化
        if (animalStrategy == null) {
            try {
                animalStrategy = (AnimalStrategy) Class.forName(strategyEnum.getValue()).newInstance();
                // 然后在 map 中添加对应的元素
                strategyMaps.put(strategyEnum.getValue(), animalStrategy);
            } catch (Exception e) {
                throw new AnimalNotFoundException("存在这个动物， 但是在策略枚举类里面的反射路径出问题啦！反射不出来orz");
            }
        }
        return animalStrategy;
    }

}
